<?php

class Solicitudes_Model_DbTable_Programas extends Zend_Db_Table_Abstract {
	
	protected $_name = 'programas';
	protected $_primary = 'codprograma';
	//protected $_rowClass = 'App_Audit_Row'; //no se necesita que se audite
	
	public function getProgramasIES($codsede,$tiposolicitud) {
	    $condicion = "n.codnivel IN (1,2,3,4,9)";
	    if ($tiposolicitud==3)$condicion = "n.codnivel IN (5,6,7,8)";
	    $select = $this->select()
	                   ->from(array("p"=>"programas"),array('codprograma','nombreprograma','codsnies','fechavencimientorc'))
	                   ->joinLeft(array('s'=>'sedes'),'s.codsede=p.codsede',array('nombresede'))
	                   ->join(array('ub'=>'ubicaciongeografica'),'ub.codubicacion=p.codubicacion',array('ub.regional ||\' - \'|| ub.nombreubicacion AS ubicacion'))
	                   ->joinLeft(array('m'=>'metodologias'),'p.codmetodologia=m.codmetodologia',array('nombremetodologia'))
	                   ->joinLeft(array('n'=>'nivelacademico'),'p.codnivel=n.codnivel',array('nombrenivel'))
	                   ->joinLeft(array('pc'=>'procesos'),'pc.codprograma=p.codprograma',NULL)
	                   ->where("p.estado=1")
	                   ->order("p.nombreprograma");
	    $select->setIntegrityCheck(false);
	    
	    if ($tiposolicitud==1){
	        $select->where("n.codnivel IN (1,2,3,4,9)");
	        $select->where("pc.codprograma IS NULL");
	    }
	    if ($tiposolicitud==2){
	        $select->where("n.codnivel IN (1,2,3,4,9)");
	        $select->where("pc.codprograma IS NOT NULL");
	    }
	    if ($tiposolicitud==3){
	        $select->where("n.codnivel IN (5,6,7,8)");
	        $select->where("pc.codprograma IS NULL");
	    }
	    if ($tiposolicitud==4){
	        $select->where("n.codnivel IN (5,6,7,8)");
	        $select->where("pc.codprograma IS NOT NULL");
	    }
	    
	    
	    if (!empty($codsede)){
	        $select->where("p.codsede=?",$codsede);
//	        $select->joinLeft(array('pc'=>'procesos'),'pc.codprograma=p.codprograma',NULL);
	        
//	        $select->where("p.codprograma NOT IN (SELECT pc.codprograma FROM procesos pc, programas p1 where p1.codprograma=pc.codprograma and p1.codsede=$codsede and pc.codestado NOT IN (19,20))");
	    }
//    Zend_Debug::dump($select->__toString());
		return $select->query()->fetchAll();
	}
	
    public function cargardatosPrograma($codprograma, $codsnies, $pro_codprograma="") {
	    $select = $this->select()
	                   ->from(array("p"=>"programas"),array('codprograma','nombreprograma','codsnies','numerocreditos','fechainicio','titulo','fechanorma',
	                                                        '(SELECT u.nombreunidadduracion FROM unidadesduracion u WHERE u.codunidadduracion=p.codunidadduracion) AS nombreduracion',
	                                                        '(SELECT pe.nombreperiodo FROM periodos pe WHERE pe.codperiodo=p.codperiodo) AS periodo',
	                                                        'codsede'))
	                   ->join(array('m'=>'metodologias'),'p.codmetodologia=m.codmetodologia',array('nombremetodologia'))
	                   ->join(array('n'=>'nivelacademico'),'p.codnivel=n.codnivel',array('codnivel','nombrenivel'))
	                   ->where("p.estado=1")
	                   ;
	    if (!empty($codprograma)){
	        $select->where("p.codprograma=?",$codprograma);
	    }
    	if (!empty($codsnies)){
	        $select->where("p.codsnies=?",$codsnies);
	    }
    	if (!empty($pro_codprograma)){
	        $select->where("p.pro_codprograma=?",$pro_codprograma);
    	    $select->setIntegrityCheck(false);
//            Zend_Debug::dump($select->__toString());
    		return $select->query()->fetchAll();
	    }else{
	        $select->limit("1");
	        $select->setIntegrityCheck(false);
//    	    Zend_Debug::dump($select->__toString());
    		return $select->query()->fetch();
	    }
	}

	public function getVigenciaResolucion($codprograma,$tipo){
		$sql = "SELECT r.fvigenini+(r.duracion*u.factordias) AS vigencia ";
		$sql.= "FROM resolucionesrc AS r, unidadesduracion AS u ";
		$sql.= "WHERE u.codunidadduracion=r.codunidadduracion AND r.codprograma={$codprograma} ";
		$sql.= "AND r.codtipoacreditacion={$tipo} AND r.aprobacion='A' AND (r.fvigenini+(r.duracion*u.factordias)) > now()";
//		Zend_Debug::dump($sql);
		return $this->getAdapter()->fetchOne($sql);
	}
	
    public function obtener_area_programa($codprograma,$prioridad) {
    	$sql = "SELECT c.nombre ";
		$sql.= "FROM clasificacionarea AS c, areasprograma AS a ";
		$sql.= "WHERE a.codclasificacionarea=c.codclasificacionarea AND a.codprograma={$codprograma} AND a.prioridadarea={$prioridad}";
//		Zend_Debug::dump($sql);
		return $this->getAdapter()->fetchOne($sql);
    }
    
	public function getProgramasasginacionusuarioSEDE($codsede,$codusuario,$opcion) {
	    $select = $this->select()
	                   ->from(array("p"=>"programas"),array('p.codprograma','p.nombreprograma','p.codsnies'))
	                   ->join(array("r"=>"procesos"),"p.codprograma=r.codprograma",NULL)
	                   ->join(array('ub'=>'ubicaciongeografica'),'ub.codubicacion=p.codubicacion',array('ub.nombreubicacion ||\', \'|| (SELECT u1.nombreubicacion FROM ubicaciongeografica u1 WHERE u1.codubicacion=ub.codpadre) AS ubicacion'))
	                   ->where("p.codsede=?",$codsede)
//	                   ->group(array('p.codprograma','p.nombreprograma','p.codsnies','ub.nombreubicacion'))
	                   ->order("p.nombreprograma")
	                   ;
	                   
		if ($opcion==1){
	        $select->join(array("pu"=>"programasusuario"),"pu.codprograma=p.codprograma",NULL);
	        $select->where("pu.codusuario=?",$codusuario);
	    }else{
            $select->joinLeft(array("pu"=>"programasusuario"),"pu.codprograma=p.codprograma AND (pu.codusuario = {$codusuario}) ",NULL);
	        $select->where("pu.codprograma IS NULL");
	    }
	    
	    
	    $select->setIntegrityCheck(false);
//	    Zend_Debug::dump($select->__toString());
		return $select->query()->fetchAll();
	}
	
	public function getConveniosNalProgramas($codprograma, $codproceso) {
	    $select = $this->select()
	                   ->from(array("p"=>"programas"),NULL)
	                   ->join(array("rc"=>"procesosrc"),"rc.codprograma=p.codprograma AND rc.codprograma={$codprograma}
	                   																   AND rc.codproceso= (SELECT rc1.codproceso FROM procesosrc rc1
	                   																   					   WHERE rc1.codprograma={$codprograma}
	                   																   					   ORDER BY rc1.codproceso DESC
	                   																   					   LIMIT 1 )",NULL)
	                   ->join(array("e"=>"entidadesnalprocesos_rel"),"e.codproceso=rc.codproceso ",NULL)
	                   ->join(array("i"=>"instituciones"),"i.codinstitucion=e.codinstitucion ", array("nombrecompleto"))
	                   ->join(array("r"=>"resolucionesrc"),"p.codprograma=r.codprograma ",NULL)
	                   ->join(array("ud"=>"unidadesduracion"),"ud.codunidadduracion=r.codunidadduracion",NULL)
	                   ->where("p.estado='A'")
	                   ->where("(r.fvigenini+(r.duracion*ud.factordias)) > now()")
	                   ->order("i.nombrecompleto DESC")
	                   ;
	    if (!empty($codprograma)){
	        $select->where("p.codprograma=?",$codprograma);
	    }
	    if (!empty($codproceso)){
	        $select->where("rc.codproceso=?",$codproceso);
	    }
	    $select->setIntegrityCheck(false);

//	    Zend_Debug::dump($select->__toString());
		return $select->query()->fetchAll();
	}
	
	public function getConveniosIntProgramas($codprograma, $codproceso) {
	    $select = $this->select()
	                   ->from(array("p"=>"programas"),NULL)
	                   ->join(array("rc"=>"procesosrc"),"rc.codprograma=p.codprograma AND rc.codprograma={$codprograma}
	                   																   AND rc.codproceso= (SELECT rc1.codproceso FROM procesosrc rc1
	                   																   					   WHERE rc1.codprograma={$codprograma}
	                   																   					   ORDER BY rc1.codproceso DESC
	                   																   					   LIMIT 1 )",NULL)
	                   ->join(array("e"=>"entidadesintprocesos_rel"),"e.codproceso=rc.codproceso ",NULL)
	                   ->join(array("i"=>"entidadesint"),"i.codentidadint=e.codentidadint ", array("nombrecompleto"))
	                   ->join(array("r"=>"resolucionesrc"),"p.codprograma=r.codprograma ",NULL)
	                   ->join(array("ud"=>"unidadesduracion"),"ud.codunidadduracion=r.codunidadduracion",NULL)
	                   ->where("p.estado='A'")
	                   ->where("(r.fvigenini+(r.duracion*ud.factordias)) > now()")
	                   ->order("i.nombrecompleto DESC")
	                   ;
	    if (!empty($codprograma)){
	        $select->where("p.codprograma=?",$codprograma);
	    }
	    if (!empty($codproceso)){
	        $select->where("rc.codproceso=?",$codproceso);
	    }
	    $select->setIntegrityCheck(false);

//	    Zend_Debug::dump($select->__toString());
		return $select->query()->fetchAll();
	}
	
	public function getAmpliacionesProgramas($codprograma, $codproceso) {
	    $select = $this->select()
	                   ->from(array("p"=>"programas"),NULL)
	                   ->join(array("rc"=>"procesosrc"),"rc.codprograma=p.codprograma AND rc.codprograma={$codprograma}
	                   																   AND rc.codproceso= (SELECT rc1.codproceso FROM procesosrc rc1
	                   																   					   WHERE rc1.codprograma={$codprograma}
	                   																   					   ORDER BY rc1.codproceso DESC
	                   																   					   LIMIT 1 )",NULL)
	                   ->join(array("a"=>"ampliacion_cobertura"),"a.codproceso=rc.codproceso AND a.estado='A' ",NULL)
	                   ->join(array("u"=>"ubicaciongeografica"),"u.codubicacion=a.codubicacion ", array("nombreubicacion"))
	                   ->join(array("r"=>"resolucionesrc"),"p.codprograma=r.codprograma ",NULL)
	                   ->join(array("ud"=>"unidadesduracion"),"ud.codunidadduracion=r.codunidadduracion",NULL)
	                   ->where("p.estado='A'")
	                   ->where("(r.fvigenini+(r.duracion*ud.factordias)) > now()")
	                   ->order("u.nombreubicacion DESC")
	                   ;
	    if (!empty($codprograma)){
	        $select->where("p.codprograma=?",$codprograma);
	    }
	    if (!empty($codproceso)){
	        $select->where("rc.codproceso=?",$codproceso);
	    }
	    $select->setIntegrityCheck(false);

//	    Zend_Debug::dump($select->__toString());
		return $select->query()->fetchAll();
	}

	public function getLugarOfrecimientoProgramas($codprograma, $tipo, $codproceso) {
	    $select = $this->select()
	                   ->from(array("p"=>"programas"),NULL)
	                   ->join(array("rc"=>"procesosrc"),"rc.codprograma=p.codprograma AND rc.codprograma={$codprograma}
	                   																   AND rc.codproceso= (SELECT rc1.codproceso FROM procesosrc rc1
	                   																   					   WHERE rc1.codprograma={$codprograma}
	                   																   					   ORDER BY rc1.codproceso DESC
	                   																   					   LIMIT 1 )",NULL)
	                   ->join(array("lp"=>"lugarofrecimiento_procesosrc"),"lp.codproceso=rc.codproceso ",NULL)
	                   ->join(array("l"=>"lugarofrecimiento"),"l.codlugarofrecimiento=lp.codlugarofrecimiento AND l.tipo='{$tipo}' AND l.estado='AC' ", array("nombre"))
	                   ->join(array("u"=>"ubicaciongeografica"),"u.codubicacion=l.codubicacion ", array("nombreubicacion"))
	                   ->join(array("r"=>"resolucionesrc"),"p.codprograma=r.codprograma ",NULL)
	                   ->join(array("ud"=>"unidadesduracion"),"ud.codunidadduracion=r.codunidadduracion",NULL)
	                   ->where("p.estado='A'")
	                   ->where("(r.fvigenini+(r.duracion*ud.factordias)) > now()")
	                   ->order("u.nombreubicacion DESC")
	                   ;
	    if (!empty($codprograma)){
	        $select->where("p.codprograma=?",$codprograma);
	    }
	    if (!empty($codproceso)){
	        $select->where("rc.codproceso=?",$codproceso);
	    }
	    $select->setIntegrityCheck(false);

//	    Zend_Debug::dump($select->__toString());
		return $select->query()->fetchAll();
	}
	public function getProgramasAux($codprograma) {
	    $select = $this->select()
	                   ->from(array("p"=>"programas"),NULL)
	                   ->join(array("rc"=>"procesosrc"),"rc.codprograma=p.codprograma AND rc.codprograma={$codprograma}
	                   																   AND rc.codproceso= (SELECT rc1.codproceso FROM procesosrc rc1
	                   																   					   WHERE rc1.codprograma={$codprograma}
	                   																   					   ORDER BY rc1.codproceso DESC
	                   																   					   LIMIT 1 )",NULL)
	                   ->join(array("pa"=>"programasaux"),"pa.codprograma=rc.codproceso ","*")
	                   ->join(array("r"=>"resolucionesrc"),"p.codprograma=r.codprograma ",NULL)
	                   ->join(array("ud"=>"unidadesduracion"),"ud.codunidadduracion=r.codunidadduracion",NULL)
	                   ->where("p.estado='A'")
	                   ->where("(r.fvigenini+(r.duracion*ud.factordias)) > now()")
	                   ->order("pa.codprograma DESC")
	                   ;
	    if (!empty($codprograma)){
	        $select->where("p.codprograma=?",$codprograma);
	    }
	    $select->setIntegrityCheck(false);

//	    Zend_Debug::dump($select->__toString());
		return $select->query()->fetch();
	}
	public function getAreasInvestigacionPrograma($codprograma) {
	    $select = $this->select()
	                   ->from(array("p"=>"programas"),NULL)
	                   ->join(array("rc"=>"procesosrc"),"rc.codprograma=p.codprograma AND rc.codprograma={$codprograma}
	                   																   AND rc.codproceso= (SELECT rc1.codproceso FROM procesosrc rc1
	                   																   					   WHERE rc1.codprograma={$codprograma}
	                   																   					   ORDER BY rc1.codproceso DESC
	                   																   					   LIMIT 1 )",NULL)
	                   ->join(array("lp"=>"programasareasinvestigacion"),"lp.codprograma=rc.codproceso ",NULL)
	                   ->join(array("l"=>"areasinvestigacion"),"l.codareainvestigacion=lp.codareainvestigacion ", array("descripcion"))
	                   ->join(array("r"=>"resolucionesrc"),"p.codprograma=r.codprograma ",NULL)
	                   ->join(array("ud"=>"unidadesduracion"),"ud.codunidadduracion=r.codunidadduracion",NULL)
	                   ->where("p.estado='A'")
	                   ->where("(r.fvigenini+(r.duracion*ud.factordias)) > now()")
	                   ->order("l.descripcion DESC")
	                   ;
	    if (!empty($codprograma)){
	        $select->where("p.codprograma=?",$codprograma);
	    }
	    $select->setIntegrityCheck(false);

//	    Zend_Debug::dump($select->__toString());
		return $select->query()->fetchAll();
	}
	public function getLineasInvestigacionPrograma($codprograma) {
	    $select = $this->select()
	                   ->from(array("p"=>"programas"),NULL)
	                   ->join(array("rc"=>"procesosrc"),"rc.codprograma=p.codprograma AND rc.codprograma={$codprograma}
	                   																   AND rc.codproceso= (SELECT rc1.codproceso FROM procesosrc rc1
	                   																   					   WHERE rc1.codprograma={$codprograma}
	                   																   					   ORDER BY rc1.codproceso DESC
	                   																   					   LIMIT 1 )",NULL)
	                   ->join(array("lp"=>"programaslineasinvestigacion"),"lp.codprograma=rc.codproceso ",NULL)
	                   ->join(array("l"=>"lineasinvestigacion"),"l.codlineainvestigacion=lp.codlineainvestigacion ", array("descripcion"))
	                   ->join(array("r"=>"resolucionesrc"),"p.codprograma=r.codprograma ",NULL)
	                   ->join(array("ud"=>"unidadesduracion"),"ud.codunidadduracion=r.codunidadduracion",NULL)
	                   ->where("p.estado='A'")
	                   ->where("(r.fvigenini+(r.duracion*ud.factordias)) > now()")
	                   ->order("l.descripcion DESC")
	                   ;
	    if (!empty($codprograma)){
	        $select->where("p.codprograma=?",$codprograma);
	    }
	    $select->setIntegrityCheck(false);

//	    Zend_Debug::dump($select->__toString());
		return $select->query()->fetchAll();
	}
	public function getFuentesInvestigacionPrograma($codprograma) {
	    $select = $this->select()
	                   ->from(array("p"=>"programas"),NULL)
	                   ->join(array("rc"=>"procesosrc"),"rc.codprograma=p.codprograma AND rc.codprograma={$codprograma}
	                   																   AND rc.codproceso= (SELECT rc1.codproceso FROM procesosrc rc1
	                   																   					   WHERE rc1.codprograma={$codprograma}
	                   																   					   ORDER BY rc1.codproceso DESC
	                   																   					   LIMIT 1 )",NULL)
	                   ->join(array("lp"=>"programasareasinvestigacion"),"lp.codprograma=rc.codproceso ",NULL)
	                   ->join(array("l"=>"lineasinvestigacion"),"l.codlineainvestigacion=lp.codlineainvestigacion ", array("descripcion"))
	                   ->join(array("r"=>"resolucionesrc"),"p.codprograma=r.codprograma ",NULL)
	                   ->join(array("ud"=>"unidadesduracion"),"ud.codunidadduracion=r.codunidadduracion",NULL)
	                   ->where("p.estado='A'")
	                   ->where("(r.fvigenini+(r.duracion*ud.factordias)) > now()")
	                   ->order("l.descripcion DESC")
	                   ;
	    if (!empty($codprograma)){
	        $select->where("p.codprograma=?",$codprograma);
	    }
	    $select->setIntegrityCheck(false);

//	    Zend_Debug::dump($select->__toString());
		return $select->query()->fetchAll();
	}
	public function getPersonalAcademicoPrograma($codprograma) {
	    $select = $this->select()
	                   ->from(array("p"=>"programas"),NULL)
	                   ->join(array("rc"=>"procesosrc"),"rc.codprograma=p.codprograma AND rc.codprograma={$codprograma}
	                   																   AND rc.codproceso= (SELECT rc1.codproceso FROM procesosrc rc1
	                   																   					   WHERE rc1.codprograma={$codprograma}
	                   																   					   ORDER BY rc1.codproceso DESC
	                   																   					   LIMIT 1 )",NULL)
	                   ->join(array("lp"=>"programaspersonalacademico"),"lp.codprograma=rc.codproceso ",NULL)
	                   ->join(array("l"=>"personalacademico"),"l.codpersonalacademico=lp.codpersonalacademico ", "*")
	                   ->join(array("n"=>"nivelacademico"),"n.codnivel=l.codnivel", array("nombrenivel"))
	                   ->join(array("t"=>"tiposdedicacion"),"t.codtipodedicacion=l.codtipodedicacion", array("nombre AS nombrededicacion"))
	                   ->join(array("r"=>"resolucionesrc"),"p.codprograma=r.codprograma ",NULL)
	                   ->join(array("ud"=>"unidadesduracion"),"ud.codunidadduracion=r.codunidadduracion",NULL)
	                   ->where("p.estado='A'")
	                   ->where("(r.fvigenini+(r.duracion*ud.factordias)) > now()")
	                   ->order("l.nombre DESC")
	                   ;
	    if (!empty($codprograma)){
	        $select->where("p.codprograma=?",$codprograma);
	    }
	    $select->setIntegrityCheck(false);

//	    Zend_Debug::dump($select->__toString());
		return $select->query()->fetchAll();
	}
	
	public function getDatoTabla($tabla,$columna,$campobusqueda,$valorbusqueda){
	    return $this->getAdapter()->fetchOne("SELECT {$columna} FROM {$tabla} WHERE {$campobusqueda}={$valorbusqueda} LIMIT 1");
	}
		
	public function getCriteriosPersonalPrograma($codprograma) {
	    $select = $this->select()
	                   ->from(array("p"=>"programas"),NULL)
	                   ->join(array("rc"=>"procesosrc"),"rc.codprograma=p.codprograma AND rc.codprograma={$codprograma}
	                   																   AND rc.codproceso= (SELECT rc1.codproceso FROM procesosrc rc1
	                   																   					   WHERE rc1.codprograma={$codprograma}
	                   																   					   ORDER BY rc1.codproceso DESC
	                   																   					   LIMIT 1 )",NULL)
	                   ->join(array("lp"=>"programascriteriospersonal"),"lp.codprograma=rc.codproceso ",NULL)
	                   ->join(array("l"=>"criteriospersonal"),"l.codcriteriopersonal=lp.codcriteriopersonal ", "*")
	                   ->join(array("t"=>"tiposcriterios"),"t.codtipocriterio=l.codtipocriterio ", array("nombre AS nombrecriterio"))
	                   ->join(array("r"=>"resolucionesrc"),"p.codprograma=r.codprograma ",NULL)
	                   ->join(array("ud"=>"unidadesduracion"),"ud.codunidadduracion=r.codunidadduracion",NULL)
	                   ->where("p.estado='A'")
	                   ->where("(r.fvigenini+(r.duracion*ud.factordias)) > now()")
	                   ->order("rc.codproceso DESC")
	                   ;
	    if (!empty($codprograma)){
	        $select->where("p.codprograma=?",$codprograma);
	    }
	    $select->setIntegrityCheck(false);

//	    Zend_Debug::dump($select->__toString());
		return $select->query()->fetchAll();
	}
	
	
}//fin de la clase
